    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO.Firebird;

import ClassesUnicas.Pessoa;
import DAO.DAOPessoa;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;

/**
 * DAOPessoaFirebird
 *
 * Versao 1.0
 *
 * Data Criação 04/12/2013
 *
 * @author Igor
 */
public class DAOPessoaFirebird extends DAOConexaoFirebird implements DAOPessoa {

    @Override
    public String sqlPesquisaPadrao(String slqInterno, String idFase, String sqlOrderBy) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String gravaPessoa(Pessoa pessoa) throws Exception {
        String vReturn = "";
        CallableStatement cs;
        cs = this.con.getCon().prepareCall("call GRAVA_PESSOA(?,?,?)");

        cs.setLong(1, pessoa.getIdPessoa());
        cs.setString(2, pessoa.getNome());
        cs.registerOutParameter(3, Types.INTEGER);
        cs.executeQuery();
        vReturn = cs.getString(3);

        this.con.getStm().executeBatch();

        return vReturn;
    }

    @Override
    public ArrayList<Pessoa> buscaPessoas(String idPessoa, String nome, String idFase, String orderBy) throws Exception {
        ResultSet result = null;
        ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
        Pessoa pessoa;
        int i = 0;
        result = this.select.executeQuery("select\n"
                + "a.ID_PESSOA,\n"
                + "a.NOME,\n"
                + "count(b.ID_PESSOA) as JOGOS\n"
                + "from PESSOA a\n"
                + "left outer join JOGO b\n"
                + "on a.ID_PESSOA = b.ID_PESSOA\n"
                + "group by a.ID_PESSOA,\n"
                + "a.NOME");

        while (result.next()) {
            pessoa = new Pessoa();

            pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
            pessoa.setNome(result.getString("NOME"));
            pessoa.setQuantidadeJogos(result.getInt("JOGOS"));

            pessoas.add(pessoa);
        }

        return pessoas;
    }

    @Override
    public Pessoa buscaPessoa(long idPessoa) throws Exception {
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;

            result = this.select.executeQuery("select\n"
                    + "a.ID_PESSOA,\n"
                    + "a.NOME\n"
                    + "from PESSOA a\n"
                    + "where a.ID_PESSOA = " + idPessoa);

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));

            }

        return pessoa;
    }

    @Override
    public Pessoa buscaPessoa(String nome) throws Exception {
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;

            result = this.select.executeQuery("select\n"
                    + "a.ID_PESSOA,\n"
                    + "a.NOME\n"
                    + "from PESSOA a\n"
                    + "where a.NOME = " + nome);

            while (result.next()) {
                pessoa = new Pessoa();

                pessoa.setIdPessoa(result.getLong("ID_PESSOA"));
                pessoa.setNome(result.getString("NOME"));

            }

        return pessoa;
    }

    @Override
    public long buscaPontuacaoMaxUltimoJogo(long idPessoa, long idFase, long idSubFase) throws Exception {
        long pontuacao = 0;
        ResultSet result = null;
        Pessoa pessoa = null;
        int i = 0;

            result = this.select.executeQuery("select max(PERC_ACERTO) as PERC_ACERTO_MAX from (\n"
                    + "select distinct (select count(*) from IMAGEM_SUB_FASE z where z.ID_INSTANCIA_SUB_FASE = b.ID_INSTANCIA_SUB_FASE  and z.ACERTOU_RESPOSTA = 1)\n"
                    + "*100/ count(c.ID_INSTANCIA_SUB_FASE) as PERC_ACERTO\n"
                    + " from\n"
                    + "(select first 1 a.ID_JOGO from INSTANCIA_JOGO a join JOGO b on a.ID_JOGO = b.ID_INSTANCIA_JOGO where b.ID_PESSOA = " + idPessoa + " order by a.DATA_INICIO desc) a\n"
                    + "join INSTANCIA_SUB_FASE b\n"
                    + "on b.ID_JOGO = a.ID_JOGO\n"
                    + "join IMAGEM_SUB_FASE c\n"
                    + "on b.ID_INSTANCIA_SUB_FASE = c.ID_INSTANCIA_SUB_FASE\n"
                    + "group by b.ID_INSTANCIA_SUB_FASE\n"
                    + ")");

            while (result.next()) {
                pontuacao = result.getLong("PERC_ACERTO_MAX");
            }

        return pontuacao;
    }

    @Override
    public int buscaQuantidadeSubFasesFinalizads(long idPessoa) throws Exception {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}
